#pragma once
#include <iostream>
#include "Protocol.hpp"

class Calculator
{
public:
    Calculator() {}
    Response Execute(const Request &req)
    {
        // 现在就好操作了，我们拿到的都是结构化的数据，功能都封装好了

        Response resp;
        switch (req.Oper())
        {
        case '+':
            resp.SetResult(req.X() + req.Y());
            break;

        case '-':
            resp.SetResult(req.X() - req.Y());
            break;

        case '*':
            resp.SetResult(req.X() * req.Y());
            break;

        case '/':
        {
            if (req.Y() == 0)
            {
                resp.SetCode(1); // 这里规定1是除零错误
            }
            else
            {
                resp.SetResult(req.X() / req.Y());
            }

            break;
        }
        case '%':
        {
            if (req.Y() == 0)
            {
                resp.SetCode(2); // 这里规定2是模 零错误
            }
            else
            {
                resp.SetResult(req.X() % req.Y());
            }

            break;
        }
        default:
            resp.SetCode(3); // 表示用户发来的计算类型的请求是非法的或者我是无法识别的
            break;
        }
        return resp;
    }
    ~Calculator() {}

private:
}cal;


std::string HandlerRequest(std::string &inbuffer)
{
    std::string request_str;
    std::string result_str;
    while (Decode(inbuffer, &request_str))
    {
        std::string resp_str;
        // 一定拿到了一个完整报文
        // 1.反序列化
        if (request_str.empty())
            break;
        Request req;
        if (!req.Deserialize(request_str))
            break;
        // 2.业务处理，这里用之前写的远程运算器做例子
        Response resp = cal.Execute(req);
        // 3.序列化
        resp.Serialize(resp_str);
        // 4.添加长度字段，报头
        Encode(resp_str);
        // 5.添加所有的应答
        result_str += resp_str;
    }
    return result_str;
}